<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index12</title>
</head>
<body>
  <script type="text/javascript">
      // // 定义两个构造函数：一个Animal动物，还有一个Dog狗，让Dog继承Animal，主要继承Animal中say函数
      // function Animal(){
      //   // 定义动物的构造函数
      // }
      // Animal.prototype.say = function(){
      //   console.log("我在叫")
      // };
      //
      // function Dog(){
      //   // 定义Dog的构造函数
      // }
      // // 给Dog的原型对象绑定Animal的实例对象
      // Dog.prototype = new Animal();
      // // 修改Dog原型对象的构造器为Dog
      // Dog.prototype.constructor = Dog;
      // // 也可以重写父构造函数中原型中的函数
      // Dog.prototype.say = function(){
      //   console.log("我正在叫")
      // };
      // // 创建Dog对象
      // var dog = new Dog();
      // console.log(Dog.prototype.constructor);// 当前Dog原型对象的构造器
      // dog.say();

      // 组合继承：使用原型链完成函数（方法）的继承，使用借用构造函数完成属性的继承
      // 借用构造函数:掌握两个函数的用法——apply、call
      // function Person(){
      //   console.log(this);
      // }
      // // Person(); // 函数的this是window
      // // new Person(); // Person对象
      // // 通过call函数是可以动态修改一个函数中的this指向
      // var dog = {
      //   name: "大黄",
      //   age: 5
      // };
      // Person.call(dog);
      // 使用借用构造+原型链来完成组合继承
      // 需求：
      //    1.定义Animal构造函数，有两个属性name和age，在Animal上定义一个函数叫自我介绍show
      //    2.定义Dog构造函数，继承Animal中name和age属性，并且自定义自己特有属性health健康值,并且要重写父构造函数的中show函数
      //    3.定义Cat构造函数，继承Animal中name和age属性，并且自定义自己的特有属性love亲密度，并且重写父构造函数的中show函数
      function Animal(name, age){
        // 将name和age绑定到当前this对象上
        this.name = name;
        this.age = age;
      }
      Animal.prototype.show = function(){
        console.log("我的名字是:" + this.name + ",我的年龄是:" + this.age);
      };
      // var animal = new Animal("哈哈",4);
      // animal.show();
      // 狗的构造函数
      function Dog(name, age, health){
        // 使用借用构造函数完成属性继承
        Animal.call(this, name, age);
        // 绑定自已的特有属性
        this.health = health;
      }
      // 使用原型链完成函数继承
      Dog.prototype = new Animal();
      // 修改Dog原型对象构造器
      Dog.prototype.constructor = Dog;
      // 重写父构造器中的原型中的show函数
      Dog.prototype.show = function(){
        console.log("我的名字是:" + this.name + ",我的年龄是:" + this.age + ",健康值:" + this.health);
      };
      // 测试
      var dog = new Dog('大黄', 6, 100);
      dog.show();
      // 猫构造函数
      function Cat(name, age, love){
        // 借用构造完成属性继承
        Animal.call(this, name, age);
        this.love = love;
      }
      // 使用原型链完成函数继承
      Cat.prototype = new Animal();
      // 修改原型对象中的构造器
      Cat.prototype.constructor = Cat;
      // 重写父构造器中的show函数
      Cat.prototype.show = function(){
        console.log("我的名字是:" + this.name + ",我的年龄是:" + this.age + ",亲密度:" + this.love);
      };
      // 测试
      var cat = new Cat("Tom", 5, 70);
      cat.show();
  </script>
</body>
</html>